Linguaggio C

 

per collaborazioni, commenti, critiche, e altro contattateci alla e-mail: clubinfo@libero.it risponderemo al più presto!

Aggregazione dati: array

di Luca Sabatucci

Lezione 8

Pagina principale | Lezione precedente | Lezione successiva


Dichiarazione di un array

Gli array sono il tipo di dato i cui valori rappresentano una corrispondenza tra un insieme di dati, detti indici, ed un insieme di valori di un determinato tipo, semplice o composto. Questa struttura è molto comoda perchè permette di definire una serie di variabili dello stesso tipo e di accedere ad esse mediante un indice. In C gli indici sono necessariamente numeri interi, compreso lo zero. Lo zero, l'indirizzo più basso, corrisponde al primo elemento dell'array.

La forma generica per la dichiarazione di un array è:

tipo nome_array[dimensione]

Tipo rappresenta il tipo primitivo o composto con cui allocare spazio per le variabili. Si noti che le variabili di un array occupano posti contigui nella memoria; nome_array rappresenta il nome con cui sarà accessibile l'intero array. Le parentesi quadre specificano che si tratta di un array, e il paramentro inserito all'interno indica la dimensione, la quale è un numero intero maggiore di uno.

Alcuni esempi sono:

int temperatura_Agosto[31];
double altezza[10];

Non è possibile usare come valore dell'indice una variabile. Si può ivece utilizzare una espressione, purchè il suo valore sia costante. Questo viene calcolato una volta per tutte al momento della compilazione e sostituito.

Per accedere, sia in lettura che in scrittura all'elemento i-esimo dell'array, si usa la notazione

nome_array[indice]

Nel fare questo si consideri sempre che gli indici di un array in C iniziano sempre dallo zero, quindi se si è definito un array di dimensione 10, gli indici vanno da 0 a 9.
Esempio:

int numero_primo[8];

numero_primo[0]=1;
numero_primo[1]=3;
numero_primo[2]=5;
numero_primo[3]=7;
numero_primo[4]=11;
numero_primo[5]=13;
numero_primo[6]=17;
numero_primo[7]=19;

Per accedere ad un elemento dell'array, si può usare come indice una variabile intera, o una espressione il cui risultato è un valore intero. Ad esempio

for (i=0; i<8; i++)
	printf("%d",numero_primo[i]);

La quantità di memoria richiesta per contenere un array è legata al tipo e alle dimensioni. Questa può essere calcolate mediante la formula:

byte_totali = sizeof(tipo) * dimensione_array;

Poichè il C è un linguaggio mirato all'efficienza, non effettua alcun controllo sugli indici dell'array, a differenza del Pascal. Di conseguenza non esiste alcuna verifica per il superamento degli indici. Quindi se si sbaglia a mettere come indice un valore fuori dal range dell'array, si rischia di "sporcare" una zona di memoria in cui sono presenti altre variabili, o addirittura il codice del programma.

Ad esempio questa porzione di codice

for (i=0; i<=8; i++)
	printf("%d",numero_primo[i];

viene compilata normalmente, ma contiene un errore sull'estremo superiore dell'array. Infatti quando i=8 la condizione sul ciclo viene rispettata e si accede alla locazione numero_primo[8] che non esiste. Deve essere quindi il programmatore che deve stare attento a questo genere di errori.

Inizializzare un array

Come tutte le variabili, gli array possono essere inizializzati alla definizione, elencando dentro parentesi graffe i valori separati da virgole.

int numeri_primo[8]={1,2,3,5,7,11,13,17};
int giorni_del_mese[] = {31,28,31,30,31,30,31,31,30,31,30,31};

Come si vede dal secondo esempio, se si elencano i valori, è possibile evitare di inserire la dimensione dell'array. Il compilatore la dedurrà dall'elenco.

All'interno dell'elenco non è possibile inserire variabili o espressioni: devono essere tutti valori costanti.

Array come argomento di una funzione

A volte capita di dover fornire come argomento di una funzione un array sul quale operare. Ad esempio si può richiedere alla funzione inizializza di azzerare tutti i suoi elementi. Tuttavia in C non è possibile passare un array come una normale variabile. L'unico modo per passare un array ad una funzione è per indirizzo. Questo significa che le modifiche interne alla funzione hanno sempre effetto al di fuori di questa.

Per passare un array ad una funzione si deve specificare nella chiamato di funzione il nome dell'array.

inizializza(numero_primo);

Nella dichiarazione della funzione in causa invece si possono usare tre stili. Due li vedremo adesso, uno invece lo vedremo nella lezione sui puntatori.

Stile 1

Il primo stile prevede che l'array venga specificato nelle dimensioni.
Esempio:

void inizializza(int array[8]) {
	numero_primo[0]=1;
	numero_primo[1]=3;
	numero_primo[2]=5;
	numero_primo[3]=7;
	numero_primo[4]=11;
	numero_primo[5]=13;
	numero_primo[6]=17;
	numero_primo[7]=19;
}		

Naturalmente questa funzione può essere usata esclusivamente per array di dimensione fissata 8.

Stile 2

Il secondo stile prevede che l'array non venga specificato nelle dimensioni.
Esempio:

void inizializza(int array[], int dimensione) {
	int i;

	for (i=0; i<dimensione; i++)
		numero_primo[i]=cerca_numero_primo();
}		

In questo caso, invece, la funzione può essere usata per array di qualunque dimensione.

Una funzione non può invece restituire un array come risultato. Vedremo sempre nella lezione sui puntatori come superare questo limite.

Stringhe

Come annunciato le stringhe in C vengono gestite mediante un array di caratteri. La specifica indica che una stringa deve essere terminata dal carattere nullo, indicato con '\0' che vale proprio zero. Per questo motivo è necessario dimensionare una stringa con un elemento in più.
Esempio:

char nome[5];
char cognome[10];

L'inizializzazione può avvenire come per i normali array, elencando gli elementi:

char nome[] = {'L','u','c','a','/0'};

oppure facendo uso delle costanti stringa. Una costante stringa è una serie di caratteri interposti tra le virgolette, ad esempio "Luca":

char cognome[] = "Sabatucci";

In questo caso non è necessario specificare il carattere nullo, perchè nella costante stringa è incluso.

Esempio di programma completo che usa le stringhe.

#include <stdio.h>
#include <string.h>

void inverti(char stringa[]);
void scambia(char stringa[],int indice1,int indice2);

int main() {
	char cognome[] = "Sabatucci";

	inverti(cognome);

	printf("%s",cognome);

	return 0;
}

/* questa funzione si occupa di invertire la stringa */
void inverti(char stringa[]) {
	int lunghezza = strlen(stringa);		/* viene calcolata la lunghezza */
	int count;

	/* per ogni carattere della prima metà della stringa... */
	for (count=0; count<lunghezza/2; count++)	
		scambia(stringa,count,lunghezza-count-1);	/* effettua lo scambio con 
									il simmetrico */
}

/* questa funzione scambia due elementi di una stringa */
void scambia(char stringa[],int indice1,int indice2) {
	char temp;	/* variabile che serve per immagazinare temporaneamente uno dei due valori */

	temp = stringa[indice1];		/* memorizza il primo valore */
	stringa[indice1]=stringa[indice2];	/* mette il secondo nel primo */
	stringa[indice2]=temp;			/* mette nel secondo il primo */
}

La libreria del C che si occupa delle stringhe è la string.h che, come si può vedere nel listato è stata usata per la funzione strlen che calcola la lunghezza di una stringa.
Altre funzioni sono:

  1. strcpy(stringa1,stringa2), che copia la stringa2 nella stringa1.
  2. strcat(stringa1,stringa2), che concatena la stringa2 alla fine della stringa1.
  3. strcmp(stringa1,stringa2), che confronta le due stringhe e restituisce 0 se le stringhe sono uguali, un valore maggiore di zero se stringa1 > stringa2, un valore minore di zero se stringa1 < stringa2.

Naturalmente nessuna di queste funzioni fa un controllo sulla dimensione degli array, quindi se ad esempio si copia una stringa di 10 caratteri, in una che al massimo ne può ospitare 5, si effettua un errore non riconosciuto che porta a malfunzionamenti.

Array multidimensionali

Un array multidimensionale presenta più di un indice per individuare la cella. Nel caso di due dimesioni si parla di matrice, ad esempio A[i][j]. In C gli array a più di una dimensione sono generati come array di array.
Ad esempio:

int tabella[10][5];
double matrice[5][5];

Per accedere agli elementi dell'array si deve usare la forma:

tabella[i][3] = 20;
valore = matrice[1][0];

Allo stesso modo per array a più di una dimensione si ha:

int risultati[10][5][3][5];
char elementi[5][5][5][5][5];

Per accedere agli elementi dell'array si deve usare la forma:

risultati[a][b][c][d] = 60;
valore = elementi[1][0][1][2][3];

Nella prossima lezione daremo qualche esempio di programma che usa le matrici, quindi riprenderemo il discorso array dopo aver trattato i puntatori, e ci accorgeremo di quanto questi due argomenti sian correlati in C.


Bibliografia


Testi consigliati per l'apprendimento

Questo articolo è stato scaricato dal Club di informatica
Pagina curata da Luca Sabatucci